/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package controladoras.negocio;
import comandos.CmdBD;
import comandos.Ins.CmdInsFuncionario;
import comandos.Sel.CmdSelFuncionario;
import interfaces.IPersistencia;
import interfaces.IGerenciaFuncionario;
import erros.ErroCadastramento;
import erros.ErroRecuperacao;
import entidades.Funcionario;
import erros.ErroPersistencia;
/**
 * Controladora de negócio da entidade funcionária.
 * @author thiagostuckert
 * @author daniel
 */
public class CntrGerenciaFuncionario implements IGerenciaFuncionario {
    /**
     * Referência para o singleton da controladora
     * de negócio da entidade funcionário.
     */
    private static CntrGerenciaFuncionario ref;
    /**
     * Referência para a controladora de persistência
     * associada à essa controladora.
     */
    private IPersistencia cntrPersistencia;

    /**
     * Associa uma controladora de persistência à essa controladora.
     * @param cntrParam Referência à controladora de persistência
     * á ser associada.
     */
    public final void setCntrPersistencia(final IPersistencia cntrParam) {
        this.cntrPersistencia = cntrParam;
    }

    /**
     * Instancia o singleton da controladora de negócio
     * da entidade funcionário.
     * @return Retorna a referência para o singleton
     */
    public static CntrGerenciaFuncionario instanciar() {
        if (ref == null) {
            ref = new CntrGerenciaFuncionario();
        }
        return (ref);
    }
    /**
     * Cadastra um funcionário do banco de dados.
     * @param funcionario Funcionário à ser cadastrado.
     * @throws ErroCadastramento Exceção lançada de erro de cadastramento
     * em caso de falha.
     */
    @Override
    public void cadastrarFuncionario(final Funcionario funcionario)
            throws ErroCadastramento{
        try {
            CmdBD comando =  new CmdInsFuncionario(funcionario);
            cntrPersistencia.executar(comando);
        } catch (ErroPersistencia e) {
            throw new ErroCadastramento("Não foi possível cadastrar o " +
                    " funcionário");
        }
    }

    /**
     * Recupera um funcionário do banco de dados.
     * @param funcionario Funcionário à ser recuperado
     * @return Retorna o funcionário recuperado do banco
     * @throws ErroRecuperacao Lança erro de recuperação em caso de falha.
     */
    @Override
    public Funcionario recuperarFuncionario(Funcionario funcionario)
            throws ErroRecuperacao {
        try {
            CmdBD comando = new CmdSelFuncionario(funcionario);
            return (Funcionario) cntrPersistencia.executar(comando);

        } catch (ErroPersistencia e) {
            throw new ErroRecuperacao("Não foi possível recuperar o " +
                    "funcionário");
        }
    }
}
